/**
 * 文件名： DesUtil.java
 * 版权： Copyright 2017-2022 CMCC All Rights Reserved.
 * 描述： 中国移动通信集团合同系统
 */
package com.rzl.expense.agent;


import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.security.SecureRandom;

/**
 * <DES加密和解密。>
 * <DES加密和解密。>
 *
 * @author zhangyunhao
 * @date 2018-9-26 9:29 PM
 */
public class DesUtil {


    //安全密钥
    private static String keyData = "SinoCMSDesUtilABEFGHIJKLNOPQRTWXYZabcdfghjklmnopqrstwxyz0123456789-_.";

    //des解密时,如果加密数据不是8的整数倍,会抛出
    //javax.crypto.IllegalBlockSizeException:
    // Input length must be multiple of 8 when decrypting with padded cipher异常
    //为了解决该问题,将数据加密后，再进行base64进行加密,解密时首先通过base64进行解密
    private static Base64 base64 = new Base64();

    //准备加密解密的变量
    private static Cipher ecipher = null;
    private static Cipher dcipher = null;


    /**
     * @param
     * @return void
     * @throws
     * @desc <初始化加密解密时用到的Cipher类>
     * <初始化加密解密时用到的Cipher类>
     * @date 2018年9月26日 10:04 PM
     */
    private static void initCipher() throws Exception {
        //DES算法要求有一个可信任的随机数源
        SecureRandom sr = new SecureRandom();
        //使用原始密钥数据创建DESKeySpec对象
        DESKeySpec dks = new DESKeySpec(keyData.getBytes());
        //创建一个密钥工厂
        SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
        //用密钥工厂把DESKeySpec转换成一个SecretKey对象
        SecretKey desKey = skf.generateSecret(dks);
        //Cipher对象实际完成加密操作
        ecipher = Cipher.getInstance("DES");
        dcipher = Cipher.getInstance("DES");
        //用密钥初始化Cipher对象
        ecipher.init(Cipher.ENCRYPT_MODE, desKey, sr);
        dcipher.init(Cipher.DECRYPT_MODE, desKey, sr);
    }


    /**
     * @param primaryData 原始数据
     * @return java.lang.String
     * @throws
     * @desc <加密数据 用生成的密钥加密原始数据>
     * <加密数据 用生成的密钥加密原始数据>
     * @date 2018年9月26日 10:04 PM
     */
    public static String encrypt(String primaryData) throws Exception {
        initCipher();
        //正式执行加密操作
        byte encryptedData[] = ecipher.doFinal(primaryData.getBytes("UTF8"));
        //返回加密数据
        return base64.encodeToString(encryptedData);
    }


    /**
     * @param encryptedData 加密后的数据
     * @return java.lang.String
     * @throws
     * @desc <用密钥解密数据>
     * <用密钥解密数据>
     * @date 2018年9月26日 10:05 PM
     */
    public static String descrypt(String encryptedData) throws Exception {
        initCipher();
        //正式执行解密操作
        byte decryptedData[] = dcipher.doFinal(base64.decode(encryptedData));
        return new String(decryptedData, "UTF-8");
    }

    public static void main(String[] args) {
        String sql ="select * from random_task where id=516";
        try {
            System.out.println("加密前的字符：" + sql);
            System.out.println("加密后的字符：" + DesUtil.encrypt(sql));
            System.out.println("解密后的字符：" + DesUtil.descrypt(DesUtil.encrypt(sql)));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}
